﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace xlsx2const
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private bool isMouseDoubleClicked = false;

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e){}
        private void ConstructTreeRecursive(string p, TreeNodeCollection treeNodeCollection)
        { throw new NotImplementedException(); }
        private void textBox1_TextChanged(object sender, EventArgs e){}

        ////////////////////////////////////////////////////////////////
        // 参照ボタンが押下された時
        ////////////////////////////////////////////////////////////////
        private void button1_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            //上部に表示する説明テキストを指定する
            fbd.Description = "フォルダを指定してください。";
            //ルートフォルダを指定する → デフォルトでDesktop
            fbd.RootFolder = Environment.SpecialFolder.Desktop;
            //最初に選択するフォルダを指定する
            //RootFolder以下にあるフォルダである必要がある
            fbd.SelectedPath = @"C:\";
            //ユーザーが新しいフォルダを作成できるようにする
            //デフォルトでTrue
            fbd.ShowNewFolderButton = true;

            //ダイアログを表示する
            if (fbd.ShowDialog(this) == DialogResult.OK)
            {
                string selectedPath = CheckUtil.checkPath_isDirectory(fbd.SelectedPath);
                //選択されたフォルダを表示する
                Console.WriteLine(selectedPath);
                //テキストボックスに選択されたフォルダパスを表示する
                textBox1.Text = fbd.SelectedPath;
                label2.Text = "検索中です...";
                treeView1.Nodes.Clear();
                treeView1.CheckBoxes = true;
                TreeNode rootNode = new TreeNode();

                rootNode.Text = selectedPath.Substring(selectedPath.LastIndexOf("\\") + 1);
                if (ConstructTreeRecursive(selectedPath, rootNode))
                {
                    treeView1.Nodes.Add(rootNode);
                }
                label2.Text = "";
            }

        }

        /*****************************************************************
         * 取得したパスからツリービューを生成する
         *****************************************************************/
        private Boolean ConstructTreeRecursive(string path, TreeNode tree)
        {
            Boolean ret = false;
            string directoryName = path;
            
            if (Directory.Exists(directoryName) == false) return false;

            DirectoryInfo directory = new DirectoryInfo(directoryName);
//            if ((directory.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
//            {
//                Console.WriteLine("[DEBUG] Hidden : " + directoryName);
//                return false;
//            }

            // ディレクトリ一覧を取得する
            DirectoryInfo[] subDirectories;
            try {subDirectories = directory.GetDirectories(); }
            catch (Exception e) { e.Message.ToString(); return false; }
            // Directories
            foreach (DirectoryInfo dir in subDirectories)
            {
                TreeNode newNode = new TreeNode();
                newNode.Text = dir.Name;
                if (ConstructTreeRecursive(directoryName + "\\" + dir.Name, newNode))
                {
                    tree.Nodes.Add(newNode);
                    ret = true; 
                }
            }
            // 今処理しているディレクトリのファイル一覧を取得する
            FileInfo[] files = directory.GetFiles("*.xlsx", System.IO.SearchOption.TopDirectoryOnly);

            //Console.WriteLine("[DEBUG] ファイルが存在したディレクトリ : " + directoryName);
            foreach (FileInfo file in files)
            {
                ret = true;
                Console.WriteLine("　→" + file.Name);
                /*
                                TreeNode newNode = node.Nodes.Add(file.Name);
                                newNode.ImageIndex = 1;
                                newNode.SelectedImageIndex = 1;
                */
                tree.Nodes.Add(file.Name);
            }

            return ret;
         }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            TreeViewEvents.afterCheck(sender, e);
//            foreach (TreeNode node in e.Node.Nodes) node.Checked = e.Node.Checked;
        }

        /**
         * 生成ボタンを押下した時
         */
        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("処理START", "INFO",
                MessageBoxButtons.OKCancel,
                MessageBoxIcon.Information,
                MessageBoxDefaultButton.Button1);
            TreeNodeCollection nc = treeView1.Nodes;
            SearchXlsxFileFromTreeView sxft = new SearchXlsxFileFromTreeView();
            sxft.searchXlsxFromTree(nc);
            string rootFullPath = textBox1.Text.Substring(
                                    0, textBox1.Text.LastIndexOf("\\") + 1);
            ArrayList list = sxft.getList();
            foreach (string ps in list)
            {
                MessageBox.Show(rootFullPath + ps, "INFO",
                    MessageBoxButtons.OKCancel,
                    MessageBoxIcon.Information,
                    MessageBoxDefaultButton.Button1);
                if (ps.IndexOf("エンティティ定義書") > 0)
                {
                    /*★*/Console.WriteLine(EntityDefinition.getEntityString(rootFullPath + ps));
                }
                else if (ps.IndexOf("シーケンス定義書") > 0)
                {
                }
                else if (ps.IndexOf("インデックス定義書") > 0)
                {
                }
                else if (ps.IndexOf("シノニム定義書") > 0)
                {
                }
            }
        }

        /**
         * 
         */
        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.Copy;
                textBox1.Text = e.Data.ToString();
            }
        }
        private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            // ドラッグ＆ドロップされたファイル
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

            //listBox1.Items.AddRange(files); // リストボックスに表示
            textBox1.Text = files[0].ToString(); // リストボックスに表示
        }

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            if (isMouseDoubleClicked)
            {
                isMouseDoubleClicked = false;
                e.Cancel = true;
            }
        }

        private void treeView1_DoubleClickBeforeExpand(object sender, EventArgs e)
        {
            isMouseDoubleClicked = true;
        }
    }
}
